Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.06.2009, 18:39
Аспирант
Отправить личное сообщение для WalterScott Посмотреть профиль Найти все сообщения от WalterScott
 
Регистрация: 10.05.2009
Сообщений: 57

Как "подождать" выполнение асинхронного запроса?
function hasChildren(id) {
	var dicHasChildren = false;
	jQuery.post(url, 
			{"sydicId": id}, 
	function(resp) {
		dicHasChildren = resp;
	});	
	return dicHasChildren;
}

function confirmDelete(obj, link) { 

        var msg = "Вы действительно хотите удалить словарь?";

    	if (hasChildren(sydicId)) 
    		msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
    	
	    var ans = confirm(msg);

        ....

Суть в следующем. Функция confirmDelete запрашивает подтверждение при удалении словаря. Функция hasChildren проверяет, не содержит ли словарь подсловари, c помощью ajax-запроса, и если содержит, то текст предупреждения должен измениться.
Проблема в том, что функция hasChildren возвращает значение не дожидаясь выполнения callback-функции, которая передается в jQuery.post и соответственно возвращаемое значение всегда остается одинаковым. Как заставить функцию hasChildren подождать выполнения запроса к серверу?
Ответить с цитированием
  #2 (permalink)  
Старый 02.06.2009, 19:06
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Так раз вы понимаете, что запрос асинхронный, значит нужно выполнять не синхронно, не пытаться сделать так, чтобы можно было подождать, а с помощью callback-функции:
function confirmDelete(obj, link) { 
	var msg = "Вы действительно хотите удалить словарь?";
	var dicHasChildren = false;
	jQuery.post(url, {"sydicId": id}, function(resp) {
		dicHasChildren = resp;
		if (dicHasChildren) {
			msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
			var ans = confirm(msg);
		}
	});    
}
Ответить с цитированием
  #3 (permalink)  
Старый 03.06.2009, 15:19
Аспирант
Отправить личное сообщение для WalterScott Посмотреть профиль Найти все сообщения от WalterScott
 
Регистрация: 10.05.2009
Сообщений: 57

Я первоначально так и делал. Сейчас понял, что происходило.
function confirmDelete(obj, link) {
        var msg = "Вы действительно хотите удалить словарь?";
    	var ans;
    	jQuery.post(    url, 
    			{"sydicId": sydicId}, 
    	function(resp) {
    		
			if (resp) { 
				msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
			}
			ans = confirm(msg);
       	});	
    	alert(ans);  //выводит раньше чем выполнилась callback-функция
    	
    	return ans ? true : false;
}
Если убрать алерт перед return, то возврат из функции будет происходить раньше, чем появилось окно confirm. То есть функция всегда возвращала false(или undefined, что равнозначно).
alert притормаживает выполнение функции, и ajax успевает отработать.
То есть я сейчас вижу только один выход - поставить перед return таймаут с каким-то фиктивным действием, чтобы не дать функции confirmDelete завершиться, прежде чем появится окно confirm.
Ответить с цитированием
  #4 (permalink)  
Старый 03.06.2009, 15:21
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

По-моему, вы не понимаете самого принципа асинхронности.
Ответить с цитированием
  #5 (permalink)  
Старый 03.06.2009, 16:18
Аспирант
Отправить личное сообщение для WalterScott Посмотреть профиль Найти все сообщения от WalterScott
 
Регистрация: 10.05.2009
Сообщений: 57

Принцип асинхронности в данном случае проявляется в том, что пока идет запрос к серверу скрипт выполняется дальше. А выполнить возврат из функции confirmDelete в callback-функции я не смогу(научите, если знаете как).
Ответить с цитированием
  #6 (permalink)  
Старый 03.06.2009, 16:20
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Если вы хотите получить какие-то данные от асинхронной функции, то нужно передавать ей callback.

function confirmDelete(obj, link, callback) // вместо return result; будет callback(result);
Ответить с цитированием
  #7 (permalink)  
Старый 03.06.2009, 17:08
Аспирант
Отправить личное сообщение для WalterScott Посмотреть профиль Найти все сообщения от WalterScott
 
Регистрация: 10.05.2009
Сообщений: 57

Не совсем понял синтаксис.
function confirmDelete(obj, link, onAjaxSuccess) {
        var msg = "Вы действительно хотите удалить словарь?";
        var ans;
        jQuery.post(    url, 
                {"sydicId": sydicId}, 
        onAjaxSuccess);    
        
 
        return onAjaxSuccess(ans) ? true : false;
}

function onAjaxSuccess(resp) {
 
            if (resp) { 
                msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
            }
            ans = confirm(msg);
           }
? onAjaxSuccess not a function
В строке с return.
Ответить с цитированием
  #8 (permalink)  
Старый 03.06.2009, 17:10
Аспирант
Отправить личное сообщение для WalterScott Посмотреть профиль Найти все сообщения от WalterScott
 
Регистрация: 10.05.2009
Сообщений: 57

Мне нужно получить то, что приходит в параметре resp.
Ответить с цитированием
  #9 (permalink)  
Старый 03.06.2009, 17:20
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

function confirmDelete(obj, link, callback) {
    $.post(url, {}, callback);
}

confirmDelete({}, 'link', function() {
    alert('Удалили');
});
Ответить с цитированием
  #10 (permalink)  
Старый 03.06.2009, 17:44
Аспирант
Отправить личное сообщение для WalterScott Посмотреть профиль Найти все сообщения от WalterScott
 
Регистрация: 10.05.2009
Сообщений: 57

Вызов confirmDelete
onClick="return confirmDelete('syDictionary', this, onAjaxSuccess);"

Скрипт
function confirmDelete(obj, link, callback) {
        var msg = "Вы действительно хотите удалить словарь?";
        var ans;
        jQuery.post(    url, 
                {"sydicId": sydicId}, 
        callback);    
 
 
        return /*что здесь?*/ ? true : false;
}
 
function onAjaxSuccess(resp) {
 
            if (resp) { 
                msg = "Словарь содержит подсловари. Вы действительно хотите удалить словарь?";
            }
            ans = confirm(msg);
           }
Вот тут
return /*что здесь?*/ ? true : false;

у меня в условии должно оказаться значение которое вернул confirm в callback-функции. Как это сделать?

Последний раз редактировалось WalterScott, 03.06.2009 в 17:46.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как прекратить выполнение скрипта ? kefi Общие вопросы Javascript 3 31.03.2009 19:05
Как разрешить выполнение activeX Marcus74 Internet Explorer 2 26.02.2009 07:38
Как приостановить выполнение цикла? SashaBorandi jQuery 3 13.02.2009 08:57